# https://github.com/bevyengine/bevy/blob/v0.14.2/docs/linux_dependencies.md#nix
{
  description = "Bevy Game Engine - Rust Lang";

  inputs = {
    nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
    fenix = {
      url = "github:nix-community/fenix";
      inputs.nixpkgs.follows = "nixpkgs";
    };
  };

  outputs =
    {
      nixpkgs,
      fenix,
      ...
    }:
    let
      systems = [
        "x86_64-linux"
        "aarch64-linux"
        "aarch64-darwin"
      ];
      # Helper function to generate a set of attributes for each system
      forAllSystems = func: (nixpkgs.lib.genAttrs systems func);
    in
    {
      devShells = forAllSystems (
        system:
        let
          pkgs = import nixpkgs {
            inherit system;
            overlays = [ fenix.overlays.default ];
          };
          lib = pkgs.lib;
        in
        {
          default = pkgs.mkShell rec {
            nativeBuildInputs = with pkgs; [
              pkg-config
              clang
              # lld is much faster at linking than the default Rust linker
              lld
            ];
            buildInputs =
              with pkgs;
              [
                # rust toolchain
                (pkgs.fenix.complete.withComponents [
                  "cargo"
                  "clippy"
                  "rust-src"
                  "rustc"
                  "rustfmt"
                ])
                # use rust-analyzer-nightly for better type inference
                rust-analyzer-nightly
                cargo-watch
              ]
              # https://github.com/bevyengine/bevy/blob/v0.14.2/docs/linux_dependencies.md#nix
              ++ (lib.optionals pkgs.stdenv.isLinux [
                udev
                alsa-lib
                vulkan-loader
                xorg.libX11
                xorg.libXcursor
                xorg.libXi
                xorg.libXrandr # To use the x11 feature
                libxkbcommon
                wayland # To use the wayland feature
              ])
              ++ (pkgs.lib.optionals pkgs.stdenv.isDarwin [
                # https://discourse.nixos.org/t/the-darwin-sdks-have-been-updated/55295/1
                apple-sdk_15
              ]);
            LD_LIBRARY_PATH = lib.makeLibraryPath buildInputs;
          };
        }
      );
    };
}
